package com.example.concurrent;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.test17")
public class Test17 {
//	static int counter = 0;
//	static Object lock = new Object();
	public static void main(String[] args) throws InterruptedException {
		Room room = new Room();
		Thread t1 = new Thread(() -> {
			for (int i = 0; i < 5000; i++) {
//				synchronized (lock) {
//					counter++;					
//				}
				// 我们在外部调用的时候，不用考虑这些方法是否会在我们这个多线程的场景下，会发生错误。因为这些方法内部是线程安全的。也就是说，
				// 这些方法是被加锁的，在我们外部是多线程的情况下，依然能够不会出现共享数据的出错问题。
				room.increment();
			}
		}, "t1");
		Thread t2 = new Thread(() -> {
			for (int i = 0; i < 5000; i++) {
//				synchronized (lock) {
//					counter--;
//				}
				room.decrement();
			}
		}, "t2");
		t1.start();
		t2.start();
		t1.join();
		t2.join();
//		log.debug("{}",counter);
		log.debug("{}", room.getCounter());
		// 原子性
		// 对象锁

	}
}

//所以说，这些方法是线程安全的
//class Room{
//	private int counter = 0;
//	public void increment() {
//		synchronized (this) {
//			counter++;
//		}
//	}
//	public void decrement() {
//		synchronized (this) {
//			counter--;
//		}
//	}
//	public int getCounter() {
//		synchronized (this) {
//			return counter;
//		}
//	}
//	
//}
class Room {
	private int counter = 0;
	//相当于锁是当前的对象
	public synchronized void increment() {
		counter++;
	}

	public synchronized void decrement() {
		counter--;
	}

	public synchronized int getCounter() {
		return counter;
	}

}
